题解:P10905 [蓝桥杯 2024 省 C] 回文字符串

封面

思路:

因为可以添加 lqb 这三个字符,所以我们可以先把左、右端的这三个字符先拿出来,然后判断一下中间是否回文,如果不回文输出 No,如果回文再判断一下左,右端拿出来的字符串。

因为只能在开头处加字符,所以当从右端取出来的字符串的字符数量比左端取出来的字符串的字符数量少时,输出 No,当从右端取出来的字符串的字符数量比左端取出来的字符串的字符数量多时,分别从两个字符串的结尾对比字符,如果字符不一样则输出 No,因为只能加,不能删。

如果以上都过了,那么就输出 Yes

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long
string s;
int T;
int main(){
cin>>T;
while(T--){
cin>>s;
int flag1=0,flag2=0;
int len=s.size();s=" "+s;
string c="";
for(int i=1;i<=len;i++){// 从开头开始
if(!flag1){
if(s[i]=='l'||s[i]=='q'||s[i]=='b')c+=s[i];// 取出字符串
else{
flag1=i;break;// 标记从哪里开始不同的
}
}
}
string d="";
for(int i=len;i>=1;i--){// 从结尾开始
if(!flag2){
if(s[i]=='l'||s[i]=='q'||s[i]=='b')d+=s[i];
else{
flag2=i;break;
}
}
}
bool bj=0;
for(int i=d.size()-1,j=c.size()-1;i>=0&&j>=0;i--,j--){
if(d[i]!=c[j]){
bj=1;break;
}
}
if(bj||d.size()<c.size()){
cout<<"No\n";continue;
}
c="",d="";
for(int i=flag1,j=flag2;i<=j;i++,j--){// 判断中间的字符串是否回文
c+=s[i];d+=s[j];
}
if(c==d)cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}